home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / dev / asm / Asm_Course2.lha / Teil15.TXT < prev    next >
Text File  |  1992-09-02  |  12KB  |  263 lines

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990
  2.  
  3.                                 15.Teil...
  4.  
  5. Tja, wie ich es versprochen habe, werden wir heute lernen wie wir unsere
  6. Prograemmchen packen, und ausserhalb vom Seka starten.
  7.  
  8. 16.Umgang mit Packern
  9.  
  10. Wie man programme ausserhalb vom Seka lauffaehig macht, das wissen wir ja
  11. schon...mit `WO`, dann wird ein lauffaehiges programm mit allen dazu
  12. gehoerigen Hunks uns so erzeugt..Der source muss dann allerdings von Seka
  13. in den Speicher gelegt worden sein, also ohne Org/Load, da er sonst nicht
  14. weiss wo das programm liegt und wie lang es ist. Also ohne Org und Load
  15. geht ja noch, aber wir wissen ja auch nicht wo dann unsere Bilderchen und
  16. Sounds liegen, dann koennten wir nicht damit arbeiten, das waere dann ja
  17. nicht so gut, oder ?
  18.  
  19. Also es muss da was anderes geben, was uns als Programmieren mit festen
  20. Adressen bei unserer arbeit unterstuetzt...
  21.  
  22. Keine Bange, das gibt es im Seka auch..aber wir muessen erstmal lernen wie
  23. man damit umgeht.
  24.  
  25. Erstmal muss man wissen wo alles liegt, das heisst, man muss den totalen
  26. ueberblick ueber sein Werk haben...
  27.  
  28. Das ist ja nicht so schwer...es koennte so aussehen
  29.  
  30. Hauptprogramm mit Abspielroutinen und so, wird nach $30000 Assembliert und
  31. ist $1267 Bytes lang. Wir notieren uns..
  32.  
  33. `Mainprog. $30000 - $31267`
  34.  
  35. Die Musik liegt wenn sie nicht direkt mit >extern in das Mainprog
  36. eingebunden wurde bei $40000. Ein groesseres Modul belegt dann z.b 75 KB.
  37. Das waeren dann 75*1024 = 76800 in Hexa = $12c00
  38.  
  39. `Modul $40000 - $52c00`
  40.  
  41. Als letztes, weil wir nichts besonderes gemacht haben kommen noch die
  42. Planes. Nehmen wir ein 32 Farben Pal bild, also 5*10240 = 51200 Hexa $c800.
  43.  
  44. `Plane $53000 - $5f800`
  45.  
  46. O.K, das waere mal ein Schnoedes geruest. Wir haben die einzelnen Adresse
  47. der Sachen die wir so brauchen.
  48. Wenn wir also das listing assemblieren, legt es erstmal den Source ab. Um
  49. den rest den wir natuerlich auf Diskette haben auch noch in den Speicher zu
  50. kriegen druecken wir, wie bekannt, `Y`...dann wird es an die
  51. Vorgeschriebenen adressen geladen.
  52.  
  53. Im groben kann man jetzt ja sagen das unser `Intro` den bereich von $30000
  54. bis $60000 belegt, natuerlich mit zwischenraeumen, aber so ungefaehr. Und
  55. genau das alles muss man natuerlich noch abspeichern. Aber vorher muessen
  56. wir mal gucken was denn dort noch steht wo wir nichts hingeladen haben. Da
  57. koennte allesmoegliche stehen, gehen wir mal davon aus das irgendwelcher
  58. muell von irgendwelche programmen dort liegt die schon lange nicht mehr
  59. laufen, vielleicht noch ein rest vom Soundtracker oder Cygnus ED...
  60.  
  61. Wenn wir das abgespeichert haben und das dem Packer zum packen geben, dann
  62. wird es nicht viel kuerzer, weil sich dieses zeug unheimlich schlecht
  63. packen laesst, also fuellen wir vor dem Assemblieren, unseren Arbeits
  64. speicher mit Nullen, das wuerde in unserem Beispiel so aussehen...
  65.  
  66. Seka>F
  67. Start)$30000
  68. End)$60000
  69. Data>0
  70.  
  71. Dann wird alles gefuellt. Jetzt koennen wir assemblieren und die Sachen
  72. einbinden.
  73. Nachdem das passiert ist muessen wir das Abspeichern. Dazu benutzen wir den
  74. Befehl `WI`, was ausgeschrieben `Write Image` heisst. Es bedeutet nicht
  75. anderes das man einen speicherbereich den man selber eingeben kann
  76. abspeichert. Allerdings wird wirklich nur der Speicherbereich
  77. abgespeichert, sonst nicht...Also ist das auch nicht Lauffaehig. Um es ans
  78. laufen zu kriegen muessten wir es mit einem Monitor nach $30000 laden und
  79. mit dem Sprung Kommando den PC auf das Intro verbiegen..dann wuerde es
  80. laufen.
  81.  
  82. Allerdings, wenn wir die Hunks selber davorsetzen, wer noch nicht weiss was
  83. Hunks sind, wartet bis ich diesen Satz fertig habe, dann schreibe ich was
  84. dazu, dann belegt das Intro satte 198 KB, und das ist ein Bisschen Viel
  85. fuer ein Intro.
  86.  
  87. Die Hunks von denen ich dauernd spreche, sind vor jedem Ausfuehrbarem
  88. Programm das der Amiga laden kann. Sie sagen ihm wo er das Programm
  89. hinlegen soll wenn es eine feste Adressen hat, oder sie sagen ihm wie er
  90. das Programm umschrieben soll wenn er es irgendwoanders hinlegen will, weil
  91. er halt da wo es hin soll keinen Platz mehr hat. Je nach programm gibt es
  92. mehr oder weniger Hunks, und sie von Hand ausrechnen, das ist einigen
  93. wenigen Programmierern vergoennt, uns nicht..also lassen wir auch die
  94. finger davon, O.K.
  95.  
  96. So, reden wir weiter ueber das vermeintliche Intro. Wiegesagt 198 Kilobyte
  97. ist ne ganze menge naemlich 202752. Was meint ihr wie lange es dauert bis
  98. er das eingeladen hat. Und die Hunks muessten woir ja auch davorsetzen, und
  99. die einzige moeglichkeiten die ich kennen waere das mit WO vom Seka
  100. abzuspeichern, aber ich hatte ja schon gesagt, das das nichts ist.
  101.  
  102. Also, wir muessen es kuerzer kriegen und startbar machen.
  103.  
  104. Jetzt will ich mal kurz sagen was ein Packer macht...wie er das macht kommt
  105. hinterher !
  106.  
  107. Ein packer verkuerzt fertige Programme oder Dateien, und erzeugt
  108. Lauffaehige Programme daraus. Aha, das hoert sich ja schonmal ganz gut aus.
  109. Wenn wir das Ding durch einen Packer jagen, haetten wir zwei Fliegen mit
  110. einer Klappe geschlagen.
  111.  
  112. Packen wir erstmal dieses Teil, dann werde ich euch noch erklaeren was es
  113. mit dem Packen ueberhaupt auf sich hat.
  114.  
  115. Also wenn ihr alles vorbereitet habt..ich meine das mit dem Fuellen und Wi
  116. und so, dann muesstet ihr jetzt das Image von dem Intro auf Diskette haben.
  117. Starten wir also den Packer...Ihr koennt im Prinzip alle packer nehmen die
  118. Images packen koennen, das es aber nicht soviele gibt, habe ich euch einen
  119. in die Box gepumpt. Bytekiller heisst das Ding.
  120.  
  121. Starten wir also den Bytekiller 1.3, den koennt ihr von mir bekommen.
  122.  
  123. Als erstes fragt er wie der Seka nach arbeitsspeicher...
  124.  
  125. Allocate work space (KBbyte)
  126.  
  127. Er will wissen wie lang die zu Packende, wir von Fach nennen das
  128. Komprimieren, Datei ist.
  129. Da muessten wir in unserem Fall 200 eingeben, ist aufgerundet, aber es ist
  130. besser ein bisschen zuviel als zuwenig.
  131. Nachdem ihr das eingeben habt Allociert er den Platz.
  132.  
  133. Dann kommt...
  134.  
  135. Filename to load
  136.  
  137. Hier muesst ihr den Filenname eingeben. Falls der Pfad nicht auf dem
  138. Directory liegt muss er auch noch eigegeben werden, also z.b
  139.  
  140. Df1:Images/Intro.ima
  141.  
  142. dann laedt er es...
  143.  
  144. Dann gibt er die Orginal laenge an. Hier koennt ihr nochmal sehen ob ihr
  145. alles richtig abgespeichert habt.
  146.  
  147. Jetzt fragt er
  148.  
  149. Offset (max. $0800) :$
  150.  
  151. Er will die Suchtiefe wissen, was das ist kommt hinterher bei der
  152. erklaerung der Funktionsweise von Packalgorhytmen.
  153. Auf jedenfall soviel..Je hoeher die Suchtiefe ist desto effenzienter
  154. arbeitet der Packer, desto kuerzer wird das Programm.
  155.  
  156. Dann verschwindet der Bytekiller fuer eine kurze oder laengere Zeit, der
  157. Bildschirm aendert staendig die Farbe....Der Meister arbeitet jetzt..
  158.  
  159. Irgendwann kommt er dann wieder, mit einer Neuen Frage
  160.  
  161. create Executable File or Data File ? (e/d) :
  162.  
  163. Jetzt will er wissen was er da gepackt hat, und als was das behandelt und
  164. abgespeichert werden muss. Hier muessen wir natuerlich Executable also `e`
  165. druecken, denn es soll ja lauffaehig sein.
  166.  
  167. Nu, nachdem er das weiss hat er im speicher die noetigen Hunks erzeugt, es
  168. fehlen allerdings noch zwei werte. Naemlich..
  169.  
  170. Locate File at :$
  171.  
  172. Da muessen wir eingeben wohin er das File entpacken soll, das heisst in
  173. unseren speziellen Fall, $30000, und das geben wir auch ein.
  174.  
  175. Nun kommt noch eine Besonderheit des Bytekillers, die Viele andere von
  176. diesen Imagepackern nicht haben. Er fragt noch wo er das entpackte
  177. anspringen soll. Denn es koennte ja sein das ein Bild bei $20000 liegt und
  178. das Mainprogramm bei $30000, dann muss man ja bei $30000 anspringen und
  179. nicht bei $20000. Viele Packer nehmen aber die Locateadresse auch als
  180. einsprungadresse, der Bytekiller nicht, er fragt
  181.  
  182. Jmp in :$
  183.  
  184. Dort geben wir die Startadresse ein. In unserem Fall auch $30000
  185.  
  186. Jetzt fragt er nur noch nach dem namen unter dem er das gepackte zeug
  187. abspeichern soll. Haben wir den eingegeben macht er das auch ganz brav.
  188. Dann kehrt er wieder ins CLI zurueck, dort kann man dann das ergebnis laden
  189. und anschauen. Es kommt allerdings vor das ein packer mal ein Programm
  190. nicht richtig entpackt kriegt oder so. Deshalb haben die meisten packer
  191. einen Decrunch effekt, der soll anzeigen wann der Packer arbeitet und wann
  192. nicht mehr, und wann das Programm dran ist. So kann man feststellen ob der
  193. Amiga schon abgestuerzt ist, oder ob er nocht entpackt. Alles Klor ?
  194.  
  195. So, dann haben wir auch schon was gepackt...jetzt will ich auch noch etwas
  196. ueber den Packvorgang selbst sagen. Ich werde das packen anhand von zwei
  197. sehr einfachen Methoden erklaeren.
  198.  
  199. Die erste Methode des Packen ist die einfachste und eignet sich
  200. hervorragend fuer bilder.
  201.  
  202. Der Packalgorhytmus geht den zu packenden speicher bereich durch,
  203. und,vergleicht ein Byte immer mit dem davor. Sobald er auf zwei gleiche
  204. trifft, schaut er sich noch das naechste an. Findet er nach dieser methode
  205. drei gleiche aufeinander folgende Bytes, dann schreibt er anstatt
  206.  
  207. $31 $31 $31
  208.  
  209. jetzt nur noch $03 $31, dann weiss er beim entpacken das jetzt 3 mal die
  210. $31 kommt. Das bringt zwar nur 1 Byte, aber was sagt ihr zum beispiel bei
  211. unserem versuch. Da sind hinter dem Mainprog auch ungefaehr 63488 Nullen,
  212. weil wir das ja gefuellt haben, die verschwinden dann auch in drei bytes,
  213. naemlich so
  214.  
  215. $00 $f8 $00
  216.  
  217. Das sagt der Entpackeroutine `Jetzt kommt $f800 mal die 0, und das ist doch
  218. eine Grossartige ersparnis, findet ihr nicht ?
  219.  
  220. Jetzt kommt die zweite einfache methode.
  221.  
  222. Der packalgorhytmus ueberprueft den Speicher bereich auf gleiche Byte
  223. folgen, wie zum beispiel $31 $45 $37 $37, findet er davon mehrere im
  224. Speicher, dann gibt er einer solche Kombination einen Namen, und dann steht
  225. nur noch der Name dieser Kombination dort, die erlaubte laenge der
  226. kombinationen ist von Packer zu Packer verschieden. Hier tritt auch der
  227. offset vom Bytekiller in aktion, er sagt dem Packalgorhytmus in welchem
  228. Umkreis er nach diesen Kombinatioenen suchen soll, wenn ihr da zum beispiel
  229. einen Wert eingebt, der ihn im bereich von einem KB suchen laesst ist diese
  230. methode halt nicht so effizient wie wenn man sie in einem Bereich von
  231. Hundert KB, oder dem ganzen listing suchen laesst. Aber wenn wir wirklich
  232. das ganze listing untersuchen wuerden, dann wuerde ein normales DemoImage,
  233. von 100 Kilobyte, Tage dauern, deshalb der Offset !
  234.  
  235. Es gibt natuerlich viele dutzend Packverfahren, aber die sind teilweise so
  236. kompliziert das nur der Programmierer weiss was da passiert, wer mehr
  237. darueber wissen schroiebt mir einen Kleinen brief, dann werde ich noch ein
  238. Paar erklaeren, aber ich glaube nicht das daran einer interresse hat.
  239.  
  240. Packer arbeiten aber nicht immer nur mit einem der verfahren, sondern haben
  241. mehrere drauf, manche gucken sich erstmal den Speicher bereich an, und
  242. entscheiden dann nachwelchem Prinzip sie das machen. Bei manchen kann man
  243. es waehlen, dann muss man aber schon ein bisschen bescheid wissen, denn ein
  244. Routine mit der man immer bombig Intros packen kann, versagt
  245. hoechstwarscheinlich an einer Textdatei, genauso umgekehrt. Die letzte
  246. gruppe von Packern benutzt halt mehrere packalgorhytmen. Sie gehen auch
  247. zwei oder drei mal ueber den Speicher, und holen mit jedem Weiter
  248. verfahren, immer mehr raus.
  249.  
  250. Naja, wenn ihr jetzt ein bisschen uebung mit dem Bytekiller habt dann
  251. faellt es euch auch nicht schwer die anderen zu verstehen, also viel spass
  252. bei der Suche nach eurem Lieblings packer.
  253.  
  254. Achja, probiert doch ein bisschen mit dem Offset rum, schaut euch dochmal
  255. an was der bytekiller mit Offset $0050 aus einer datei macht, und was mit
  256. Offset $0800. Ist Vielleicht mal ganz interressant, zu wissen wo er
  257. aufhoert effektiv zu werden, oder ab wann er einfach zu langsam wird !
  258.  
  259. Bye...
  260.  
  261.                 Jeff Kandle
  262.  
  263.